package Servicios;

import java.util.List;

import Negocio.Envio;
import Persistencia.IRepository;
import Persistencia.QueryParameter;
import Persistencia.Repository;
import Persistencia.RepositoryException;

/**
 * DAO de Envios (Singleton) Esta clase se encarga de brindar las funciones
 * necesarias para manejar los <b>Envios</b> en la base de datos.
 */
public class ServicioEnvios {
	private IRepository<Envio> repositorioEnvios;
	private static ServicioEnvios instance = null;

	private ServicioEnvios() {
		this.repositorioEnvios = new Repository<Envio>();
	}

	public static ServicioEnvios getInstance() {
		if (instance == null) {
			instance = new ServicioEnvios();
		}
		return instance;
	}

	/**
	 * Funcion que retorna todos los envios de la base de datos
	 * 
	 * @return List<Envio> envios
	 * @throws ServiceException
	 */
	public List<Envio> getEnvios() throws ServiceException {
		List<Envio> envios;

		try {
			envios = this.repositorioEnvios.getAll(Envio.class);
		} catch (RepositoryException e) {
			throw new ServiceException(e);
		}

		return envios;
	}

	/**
	 * @param Envio envio
	 * @throws ServiceException
	 */
	public void guardarOActualizar(Envio envio) throws ServiceException {
		try {
			this.repositorioEnvios.saveOrUpdate(envio);
		} catch (RepositoryException e) {
			throw new ServiceException(e);
		}
	}

	public Envio getEnvio(int envioId) throws RepositoryException {
		String queryExpression = "from Envio e where e.envioId = :envioId";
		QueryParameter parameter = new QueryParameter("envioId", envioId);
		Envio envio = this.repositorioEnvios.get(queryExpression, parameter);

		return envio;
	}

	public Boolean existeEnvio(int envioId) throws RepositoryException {
		return this.getEnvio(envioId) != null;
	}

	/**
	 * Funcion para eliminar una envio de la base de datos
	 * 
	 * @param Envio envio
	 * @throws RepositoryException
	 */
	public void eliminarEnvio(Envio envio) throws RepositoryException {
		this.repositorioEnvios.delete(envio);
	}

}
